package slidingwindow

import (
	"errors"
)

var (
	NoRunError   = errors.New("no run")
	RunIngError  = errors.New("run ing")
	InvalidError = errors.New("invalid")
)

// ISlidingWindows 滑窗计数器
type ISlidingWindows interface {
	// SetUp 设置滑窗时间长度，桶数量
	// 如果滑窗在开始运动前没有执行此方法，滑窗将按照默认值 timeLength=1秒,bucketNum=10进行运动
	// 正在允许的窗体不支持设置该值，报错误RunIngError
	SetUp(timeLength int32, bucketNum int32) error
	// Event 往桶填充事件，每次调用加1，线程安全
	// 不再允许的窗体会报NoRunError
	Event() error
	// Output 滑窗输出
	// 输出1：滑窗事件数量
	// 输出2：滑窗统计的QPS
	// 输出3：如果滑窗从未运行过，则会报InvalidError
	Output() (int32, float32, error) // 获取滑窗请求总数
	// Run 开始运动，运动时支持事件填充
	Run() error
	// Stop 停止运动，停止应和run成对出现，任何时候run之后都要记得停止,不然相应资源不会被释放
	Stop() error
}
